import { getCookieFun } from '@/utils/storage';
import { message } from 'ant-design-vue';
import type { RouteLocationNormalized, RouteLocationRaw, Router } from 'vue-router';
import { useUserStore } from '../stores/user';
import './types'; // 导入路由类型扩展

/**
 * 不用登录就能访问的路由（备用配置）
 */
const GUEST_ONLY_ROUTES = ['login', 'register'];

/**
 * 检查用户是否已登录
 * @returns {boolean} 是否已登录
 */
function isAuthenticated(): boolean {
  const token = getCookieFun('token');
  return !!token && token.trim() !== '';
}

/**
 * 获取默认重定向路径
 * @param isLoggedIn 是否已登录
 * @returns 重定向路径
 */
function getDefaultRedirectPath(isLoggedIn: boolean): string {
  return isLoggedIn ? '/course' : '/login';
}

/**
 * 全局前置路由守卫
 * @param to 目标路由
 * @param from 来源路由
 */
async function beforeEachGuard(
  to: RouteLocationNormalized,
  from: RouteLocationNormalized
): Promise<RouteLocationRaw | boolean> {
  const userStore = useUserStore();
  const isLoggedIn = isAuthenticated();
  const routeName = to.name as string;

  // 如果访问根路径，根据登录状态进行重定向
  if (to.path === '/') {
    return getDefaultRedirectPath(isLoggedIn);
  }

  // 优先使用路由meta信息，否则使用备用配置
  const requiresAuth = to.meta?.requiresAuth || !GUEST_ONLY_ROUTES.includes(routeName);
  const guestOnly = to.meta?.guestOnly || GUEST_ONLY_ROUTES.includes(routeName);

  // 检查已登录用户不应该访问的路由
  if (guestOnly) {
    if (isLoggedIn) {
      message.info('您已登录，正在跳转到课程页面');
      return { name: 'course' };
    }
  }

  // 检查需要登录的路由
  if (requiresAuth) {
    if (!isLoggedIn) {
      message.warning('请先登录');
      return { name: 'login', query: { redirect: to.fullPath } };
    } else {
      // 获取用户信息
      if (!userStore.userInfo.id) {
        await userStore.fetchUserInfo();
      }
    }
  }

  // 允许访问
  return true;
}

/**
 * 全局后置路由守卫
 * @param to 目标路由
 * @param from 来源路由
 */
function afterEachGuard(to: RouteLocationNormalized, from: RouteLocationNormalized): void {
  // 可以在这里添加页面访问统计、设置页面标题等逻辑

  // 设置页面标题 - 优先使用路由meta中的title
  const routeTitles: Record<string, string> = {
    course: '课程中心',
    'user-center': '个人中心',
    login: '用户登录',
    register: '用户注册',
  };

  const title = to.meta?.title || routeTitles[to.name as string] || '教育平台';
  document.title = `${title} - 我的教育项目`;

  // 记录路由变化（开发环境）
  if (import.meta.env.DEV) {
    console.log(
      `[Router] 导航: ${String(from.name) || 'unknown'} -> ${String(to.name) || 'unknown'}`
    );
  }
}

/**
 * 路由错误处理
 * @param error 错误对象
 * @param to 目标路由
 * @param from 来源路由
 */
function onErrorGuard(
  error: Error,
  to: RouteLocationNormalized,
  from: RouteLocationNormalized
): void {
  console.error('[Router Error]', error);
  message.error('页面加载失败，请重试');

  // 可以根据错误类型进行不同处理
  if (error.message.includes('Loading chunk')) {
    // 处理代码分割加载失败
    message.error('页面资源加载失败，请刷新页面重试');
  }
}

/**
 * 安装路由守卫
 * @param router Vue Router 实例
 */
export function setupRouterGuards(router: Router): void {
  // 全局前置守卫
  router.beforeEach(beforeEachGuard);

  // 全局后置守卫
  router.afterEach(afterEachGuard);

  // 全局错误处理
  router.onError(onErrorGuard);
}

/**
 * 导出守卫配置，供外部使用
 */
export const guardConfig = {
  GUEST_ONLY_ROUTES,
  isAuthenticated,
  getDefaultRedirectPath,
};
